package com.xoa.controller.im;

import com.xoa.controller.im.Model.ImMessageModel;
import com.xoa.controller.im.Model.ImRoomModel;
import com.xoa.controller.im.Model.Status;
import com.xoa.model.im.ImChatData;
import com.xoa.model.im.ImMessage;
import com.xoa.model.im.ImRoom;
import com.xoa.model.users.SimpleUser;
import com.xoa.model.users.Users;
import com.xoa.service.im.ImChatDataService;
import com.xoa.util.CookiesUtil;
import com.xoa.util.ToJson;
import com.xoa.util.common.MobileCheck;
import com.xoa.util.common.StringUtils;
import com.xoa.util.common.session.SessionUtils;
import com.xoa.util.common.wrapper.BaseWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 
 * @作者 韩东堂
 * @创建日期 2017-4-24 上午11:42:27
 * @类介绍 IM信息处理类
 * @构造参数 无
 * 
 */
@RestController
@RequestMapping("/im")
public class ImChatDataController {
	@Autowired
    ImChatDataService imChatDataService;
	/**
	 * 
	 * 创建作者:   杨 胜
	 * 创建日期:   2017-5-22 上午9:28:04
	 * 方法介绍:   存储一条信息
	 * 参数说明:   @param request  请求
	 * 参数说明:   @param flag 根据判断
	 * 参数说明:   @param from_uid 发送消息人员id
	 * 参数说明:   @param to_uid   接收消息人员id
	 * 参数说明:   @param of_from  发送消息openfirid者
	 * 参数说明:   @param of_to  接収信息openfirid
	 * 参数说明:   @param content 会话内容
	 * 参数说明:   @param type 消息类型 （text:文本,voice:语音,img:图片,file:附件,local:位置,withdraw:撤回,groupgeneral:群聊提醒类型）
	 * 参数说明:   @param stime 发送时间
	 * 参数说明:   @param uuid  声音的uuid
	 * 参数说明:   @param msg_type  消息类型 （1单聊，2群聊）
	 * 参数说明:   @param voice_time 插入声音    将声音时长记录在THUMBNAIL_URL中
	 * 参数说明:   @return 根据要求一个请求用到多种返回类型 用Object包装 返回多种json方式
	 * @return     Object
	 */
	@RequestMapping("/putMessage")
	@ResponseBody
	public Object putMessageInfo(@RequestParam(required = false,name = "file") MultipartFile file, HttpServletRequest request, Integer flag, String from_uid,
                                 String to_uid, String of_from, String of_to, String content,
                                 String type, String stime, String uuid, String msg_type, String voice_time, Long atime) {
        System.out.println("-------putMessage----------");
		MultipartFile[] flies =new MultipartFile[1];
		if(file!=null){
			flies[0]=file;
		}
		if(!MobileCheck.isMobileDevice(request.getHeader("User-Agent").toUpperCase())){
			return imChatDataService.putMessageInfoPc(flies,request,flag,from_uid, to_uid, of_from,of_to, content, type, stime, uuid,msg_type,voice_time);
		}
        Object status = imChatDataService.putMessageInfo(file,request,flag,from_uid, to_uid, of_from,of_to, content, type, stime, uuid,msg_type,voice_time,atime);
        return status;
	}
	/**
	 * 
	 * 创建作者:   杨 胜
	 * 创建日期:   2017-5-22 上午9:52:36
	 * 方法介绍:   取得会话消息列表
	 * 参数说明:   @param request 请求
	 * 参数说明:   @param of_from 当前用户的openfireid
	 * 参数说明:   @return
	 * @return     List<ImMessageModel>   
	 */
	@RequestMapping("/getImList")
	@ResponseBody
	public List<ImMessageModel> getImList(HttpServletRequest request, String of_from) {
		System.out.println("-------getImList----------");
		List<ImMessageModel> list=new ArrayList<ImMessageModel>();
		try {
			//FIXME 查询房间只按创建人查询了。

			list=imChatDataService.getImChatList(request,of_from);
		} catch (FileNotFoundException e) {
			return list;
		} catch (IOException e) {
			e.printStackTrace();
			return list;
			
		} catch (LineUnavailableException e) {
			e.printStackTrace();
			return list;
			
		} catch (UnsupportedAudioFileException e) {
			e.printStackTrace();
			return list;
		}
		return list;
	}

	@RequestMapping("/getSqlType")
	@ResponseBody
	public ToJson<ImMessageModel> getImList1(HttpServletRequest request){
		String sqlType =(String) request.getSession().getAttribute(
				"loginDateSouse");
		ToJson<ImMessageModel> toJson=new ToJson<>();
		Cookie redisSessionId = CookiesUtil.getCookieByName(request,"redisSessionId");
		Users users = SessionUtils.getSessionInfo(request.getSession(),Users.class,new Users(),redisSessionId);
		int str = users.getUid();
		ImMessageModel messageModel = new ImMessageModel();
		messageModel.setSqlType(sqlType);
		messageModel.setStr(str);
		toJson.setObject(messageModel);
		toJson.setMsg("ok");
		return toJson;
	}

	/**
	 *
	 * 创建作者:   张丽军
	 * 创建日期:   2017-5-22 上午9:52:36
	 * 方法介绍:   取得会话消息列表（移动端）
	 * 参数说明:   @param request 请求
	 * 参数说明:   @param of_from 当前用户的openfireid
	 * 参数说明:   @return
	 * @return     List<ImMessageModel>
	 */
	@RequestMapping("/getImList1")
	@ResponseBody
	public List<ImMessageModel> getImList1(HttpServletRequest request, String of_from,String content,String toName,Integer pageSize ,Integer page, Boolean useFlag) {
		String sqlType =(String) request.getSession().getAttribute(
				"loginDateSouse");
		Cookie redisSessionId = CookiesUtil.getCookieByName(request,"redisSessionId");
		Users users = SessionUtils.getSessionInfo(request.getSession(),Users.class,new Users(),redisSessionId);
		int str = users.getUid();
		ImMessageModel messageModel = new ImMessageModel();
		messageModel.setSqlType(sqlType);
		messageModel.setStr(str);
		System.out.println("-------getImList----------");
		List<ImMessageModel> list=null;
		try {
			list=imChatDataService.getImChatList1(request,of_from,toName,content,pageSize,page,useFlag);
		} catch (FileNotFoundException e) {
			return list;
		} catch (IOException e) {
			e.printStackTrace();
			return list;

		} catch (LineUnavailableException e) {
			e.printStackTrace();
			return list;

		} catch (UnsupportedAudioFileException e) {
			e.printStackTrace();
			return list;
		}
		return list;
	}



	/**
	 * 创建作者:   杨 胜
	 * 创建日期:   2017-5-22 上午9:53:55
	 * 方法介绍:   撤回一条信息（暂时未用，可用PC端需用到，且重写）
	 * @参数说明 @param uuid 要撤回的消息的uuid
	 * 参数说明:   @return
	 * @return     ToJson
	 */
	@RequestMapping("/rollBackMessage")
	@ResponseBody
	public ToJson<ImMessage> rollBackMessage(String uuid) {
		return imChatDataService.rollBackMessage(uuid);
	}

	/**
	 * 创建作者:   杨 胜
	 * 创建日期:   2017-5-22 上午10:43:04
	 * 方法介绍:   获取聊天历史记录
	 * 参数说明:   @param request
	 * 参数说明:   @param of_from
	 * 参数说明:   @param of_to
	 * 参数说明:   @param last_time
	 * 参数说明:   @return
	 * @return     List<ImMessageModel>
	 */

	@RequestMapping("/showMessageList")
	@ResponseBody
	public List<ImMessageModel> showMessageList(HttpServletRequest request, String of_from, String of_to, String last_time, String msg_type,
                                                @RequestParam(name = "pagenum", required = false, defaultValue = "1")	  Integer pagenum){
		System.out.println("-------showMessageList----------");
		ToJson<ImMessageModel> list=new ToJson<ImMessageModel>();
		List<ImMessageModel> imMessageModelList=new ArrayList<ImMessageModel>();
		try {

			imMessageModelList=imChatDataService.showMessageList(request,of_from, of_to, last_time,msg_type,pagenum).getObj();

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (LineUnavailableException e) {
			e.printStackTrace();
		} catch (UnsupportedAudioFileException e) {
			e.printStackTrace();
		}
		return  imMessageModelList;
	}


	@RequestMapping("/showMessageListRilegou")
	@ResponseBody
	public ToJson<ImMessageModel> showMessageListRilegou(HttpServletRequest request, String of_from, String of_to, String last_time, String msg_type,
                                                         @RequestParam(name = "pagenum", required = false, defaultValue = "1")	  Integer pagenum , String type , String fileName, String searchMsg){
		System.out.println("-------showMessageList----------");
		ToJson<ImMessageModel> list=new ToJson<ImMessageModel>();

		try {
			list=imChatDataService.showMessageListRiLeGou(request,of_from, of_to, last_time,msg_type,pagenum,type ,fileName ,searchMsg);

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (LineUnavailableException e) {
			e.printStackTrace();
		} catch (UnsupportedAudioFileException e) {
			e.printStackTrace();
		}
		return  list;
	}
	/**
	 * 
	 * 创建作者:   杨 胜
	 * 创建日期:   2017-5-22 上午9:55:52
	 * 方法介绍:   获取所有房间信息
	 * 参数说明:   @param of_from 当前用户的openfireid
	 * 参数说明:   @return
	 * @return     List<ImRoomModel>
	 */
	@RequestMapping("/getAllRoom")
	@ResponseBody
	public List<ImRoomModel> getAllRoom(HttpServletRequest request, String uid){
		System.out.println("-------getAllRoom----------");
		return imChatDataService.getAllRoom(uid);
	}

	/**
	 * pc端群管理接口
	 */
	@RequestMapping("/getAllRoomPc")
	@ResponseBody
	public List<ImRoomModel> getAllRoomPc(HttpServletRequest request,String uid){
		System.out.println("-------getAllRoom----------");
		return imChatDataService.getAllRoomPc(uid);
	}

	/**
	 * 获取单个房间信息
	 */



	/**  
	 * 创建作者:   杨 胜
	 * 创建日期:   2017-5-22 上午10:30:10
	 * 方法介绍:   获取单个房间信息
	 * 参数说明:   @param room_id 房间openfireid
	 * 参数说明:   @return 
	 * @return     ImRoomModel 
	 */
	
	@RequestMapping("/getSingleRoom")
	@ResponseBody
	public ImRoomModel getSingleRoom(HttpServletRequest request, String room_id){
		System.out.println("-------getSingleRoom----------");
		return imChatDataService.getSingleRoom(room_id);
	}
	
	/**
	 * 
	 * 创建作者:   杨 胜
	 * 创建日期:   2017-5-22 上午10:41:07
	 * 方法介绍:   创建房间
	 * 参数说明:   @param name  房间名称
	 * 参数说明:   @param set_uid   创建人uid
	 * 参数说明:   @param set_of   创建人openfireid
	 * 参数说明:   @param member_uid   房间成员uid串，用逗号分隔
	 * 参数说明:   @param stime  创建时间
	 * 参数说明:   @param room_of  房间openfireid
	 * 参数说明:   @return
	 * @return     Status  返回状态
	 */
	@RequestMapping("/insertRoom")
	@ResponseBody
	public Status insertRoom(HttpServletRequest request, String name, String set_uid, String set_of, String member_uid, String stime, String room_of){
		return imChatDataService.insertRoom(request,name,set_uid,set_of,member_uid,stime,room_of);
	}
	@RequestMapping("/createRoom")
	@ResponseBody
	public BaseWrapper creatRoom(HttpServletRequest request, String description,
								 String natrueName, String members){
		Cookie redisSessionId = CookiesUtil.getCookieByName(request,"redisSessionId");
		Users users = SessionUtils.getSessionInfo(request.getSession(),Users.class,new Users(),redisSessionId);
		Integer ownerUserId=null;
		if(users!=null){
			ownerUserId=users.getUid();
		}
		String companyId=SessionUtils.getSessionInfo(request.getSession(),"loginDateSouse",String.class,redisSessionId);
		if(StringUtils.checkNull(companyId)){
			companyId="1001";
		}
		return imChatDataService.creatRoom(request,companyId,users.getUid(),description,natrueName,members);
	}

	/**
	 *
	 * 创建作者:   杨 胜
	 * 创建日期:   2017-5-22 上午10:30:46
	 * 方法介绍:    主动退出某个群／踢人/解散某个群
	 * 参数说明:   @param room_id  房间openfireid
	 * 参数说明:   @param delete_uid  要退出／踢的人的uid
	 * 参数说明:   @param opt  1（主动退出某个群／踢人）   2（解散某个群）
	 * 参数说明:   @return
	 * @return     Status 返回状态
	 */
	@RequestMapping("/getOutPerson")
	@ResponseBody
	public Status getOutPerson(HttpServletRequest request, String room_id, String delete_uid, String opt){
		return imChatDataService.getOutPerson(request,room_id,delete_uid,opt);
	}

	/**
	 * 创建作者:   牛江丽
	 * 创建日期:   2018-2-6 下午3:26:45
	 * 方法介绍:   群恢复（群解散后的恢复操作）
	 * 参数说明:   @param room_id 群openfireId
	 * @return json
	 */
	@RequestMapping("/roomRever")
	@ResponseBody
	public ToJson<ImRoom> roomRever(HttpServletRequest request,String room_id) {
		return imChatDataService.roomRever(request,room_id);
	}

	/**
	 * 创建作者:   杨 胜
	 * 创建日期:   2017-5-22 上午10:42:18
	 * 方法介绍:   开启或关闭成员邀请
	 * 参数说明:   @param room_id  房间openfireid
	 * 参数说明:   @param check  1:开启  0:关闭
	 * 参数说明:   @return
	 * @return     Status
	 */
	@RequestMapping("/openInvite")
	@ResponseBody
	public Status openInvite(HttpServletRequest request, String room_id, String check){
		return imChatDataService.openInvite(room_id,check);
	}
	
	/** 
	 * 
	 * 创建作者:   杨 胜
	 * 创建日期:   2017-5-22 上午10:31:02
	 * 方法介绍:   删除一条消息
	 * 参数说明:   @param deleteuuid  要删除的消息的uuid
	 * 参数说明:   @return
	 * @return     Status
	 */
	@RequestMapping("/deleteMessage")
	@ResponseBody
	public Status deleteMessage(String uid, String deleteuuid){
		return imChatDataService.deleteMessage(deleteuuid,uid);
	}
	
	/** 
	 * 创建作者:   杨 胜
	 * 创建日期:   2017-5-22 上午10:32:17
	 * 方法介绍:   邀请好友加入某个群
	 * 参数说明:   @param room_id  房间openfireid
	 * 参数说明:   @param invite_uid 邀请的人uid串，用逗号分隔
	 * 参数说明:   @return
	 * @return     Status
	 */
	@RequestMapping("/getPersonToRoom")
	@ResponseBody
	public Status getPersonToRoom(HttpServletRequest request, String room_id, String invite_uid){
		return imChatDataService.getPersonToRoom(request,room_id,invite_uid);
	}
	
	/**
	 *
	 * 创建作者:   杨 胜
	 * 创建日期:   2017-5-22 上午10:38:23
	 * 方法介绍:   修改房间名称
	 * 参数说明:   @param room_id
	 * 参数说明:   @param room_name
	 * 参数说明:   @return
	 * @return     Status
	 */
	@RequestMapping("/updateRoomName")
	@ResponseBody
	public Status updateRoomName(HttpServletRequest request, String room_id, String room_name,Integer roomNo,String roomRemark,String roomIntroduce){
		return imChatDataService.updateRoomName(room_id,room_name,roomNo,roomRemark,roomIntroduce);
	}


	@RequestMapping("/updateRoom")
	@ResponseBody
	public BaseWrapper updateRoom(HttpServletRequest request,Integer orderId,
								  String notice,
								  String introduce,
								  String name,String roomOf,String members,Integer flag,String rsetUid){
		Cookie redisSessionId = CookiesUtil.getCookieByName(request,"redisSessionId");
		String companyId=SessionUtils.getSessionInfo(request.getSession(),"loginDateSouse",String.class,redisSessionId);
		if(StringUtils.checkNull(companyId)){
			companyId="1001";
		}
		return imChatDataService.updateRoom(request,orderId,notice,introduce,name,roomOf,members,flag,rsetUid);
	}

	/**
	 * 
	 * 创建作者:   杨 胜
	 * 创建日期:   2017-6-22 上午9:48:30
	 * 方法介绍:   获取某个聊天内的图片与附件
	 * 参数说明:   @param other_id 好友的uid或房间openfireid
	 * 参数说明:   @param my_uid 当前用户的uid
	 * 参数说明:   @return
	 * @return    
	 */
	@RequestMapping("/getAttchments")
	@ResponseBody
	public List<ImMessageModel> getAttchment(HttpServletRequest req, String other_id, String my_uid){
		try {
			return imChatDataService.getAttchments(other_id,my_uid,req);
		} catch (IOException e) {
			e.printStackTrace();
			return new ArrayList<ImMessageModel>();
		}
	
	}
	/**
	 * 
	 * 创建作者:   杨 胜
	 * 创建日期:   2017-6-22 下午4:43:39
	 * 方法介绍:   检索历史纪录
	 * 参数说明:   @param req
	 * 参数说明:   @param other_id
	 * 参数说明:   @param my_uid
	 * 参数说明:   @return
	 * @return     List<ImMessageModel>
	 */
	@RequestMapping("/selectMessage")
	@ResponseBody
	public List<ImMessageModel> selectMessage(HttpServletRequest req, String other_id, String my_uid, String keyword, String msg_type){
		try {
			Map<String, Object> map=new HashMap<String, Object>();
			map.put("other_id", other_id);
			map.put("req", req);
			map.put("my_uid", my_uid);
			map.put("keyword", keyword);
			map.put("msg_type", msg_type);
			return imChatDataService.selectMessage(map);
		} catch (Exception e) {
			e.printStackTrace();
			return new ArrayList<ImMessageModel>();
		}
	
	}
	/**
	   * 
	   * 创建作者:   杨 胜
	   * 创建日期:   2017-6-22 下午5:42:12
	   * 方法介绍:   开启或者关闭消息免打扰
	   * 参数说明:   @param req 
	   * 参数说明:   @param list_id 列表id
	   * 参数说明:   @param type  1:开启  0:关闭
	   * 参数说明:   @param set_uid  当前用户uid
	   * 参数说明:   @return
	   * @return     Status
	   */
	@RequestMapping("/updateMsgFree")
	@ResponseBody
	public Status updateMsgFree(HttpServletRequest req, String list_id, String type, String set_uid){
		try {
			Map<String, Object> map=new HashMap<String, Object>();
			map.put("list_id", list_id);
			map.put("req", req);
			map.put("type", type);
			map.put("set_uid", set_uid);
			Status status=imChatDataService.updateMsgFree(map);
			return  status;
		} catch (Exception e) {
			e.printStackTrace();
			Status s=new Status();
			s.setStatus("error");
			return s;
		}
	}
	/**
	 * 
	 * 创建作者:   高亚峰
	 * 创建日期:   2017-6-23 下午18:40:48
	 * 方法介绍:   获取某个列表的权限（免打扰、群成员是否有邀请权限等）
	 * 参数说明:   @param req
	 * 参数说明:   @param of_from  OF发消息人UID
	 * 参数说明:   @param of_to OF 收消息人UID
	 * 参数说明:   @param msg_type 会话类型（1单聊，2群聊）
	 * 参数说明:   @return
	 * @return     ImMessageModel  实体类
	 */
	@RequestMapping("/getPriv")
	@ResponseBody
	public ImMessageModel getPriv(HttpServletRequest request, String of_from, String of_to, String msg_type){
		ImMessageModel priv=null;
		try {
			priv = imChatDataService.getPriv(of_from,of_to,msg_type,request);
		} catch (Exception e) {
		  e.getMessage();
		}
		return priv;
	}

	/**
	 *
	 * 创建作者:   牛江丽
	 * 创建日期:   2017-12-26 下午1:56:29
	 * 方法介绍:   删除列表消息
	 * @return
	 */
	@RequestMapping("/delChatList")
	@ResponseBody
	public ToJson<ImChatData> delChatList(HttpServletRequest request, int listId) {
		return imChatDataService.delChatList(request,listId);
	}

	/**
	 *
	 * 创建作者:   牛江丽
	 * 创建日期:   2017-1-3 下午16:04:29
	 * 方法介绍:   根据roomOf获取群人员
	 * @return
	 */
	@RequestMapping("/getRoomPerson")
	@ResponseBody
	public ToJson<SimpleUser> getRoomPerson(HttpServletRequest request, String roomOf) {
		return imChatDataService.getRoomPerson(request,roomOf);
	}

	/**
	 *
	 * 创建作者:   张航宁
	 * 创建日期:   2020-08-12
	 * 方法介绍:   删除消息
	 * @return
	 */
	@RequestMapping("/deleteByUUID")
	@ResponseBody
	public ToJson deleteByUUID(String uuid) {
		return imChatDataService.deleteByUUID(uuid);
	}
}
